package com.sxkiler.demo.rpc.common;

import com.alibaba.nacos.api.naming.pojo.Instance;
import com.sxkiler.demo.rpc.model.RpcService;
import com.sxkiler.demo.rpc.nacos.NacosTemplate;
import com.sxkiler.demo.utils.BeanUtils;
import org.reflections.Reflections;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 来看一下是如何将带有@RpcService注解的类加载到“Bean容器”中的
 */

public class InitAnnotatedObject {

    public static Map<String,Object> init(){
        Map<String, Object> map = new HashMap<>();
        try{
            Reflections reflections = new Reflections("com.sxkiler.demo.biz");//创建一个Reflections 对象，并指定要扫描的包路径
            Set<Class<?>> typesAnnotatedWith = reflections.getTypesAnnotatedWith(RpcService.class);//该方法会扫描指定包路径下带有@RpcService注解的类的Class对象，并封装成一个set集合
            typesAnnotatedWith.stream().forEach(aClass -> {
                if (aClass.isAnnotationPresent(RpcService.class)) {
                    RpcService annotation = aClass.getAnnotation(RpcService.class);
                    try {
                        //遍历set集合，通过反射创建Class的对象
                        Object o = BeanUtils.buildBean(annotation.serviceName(),aClass);
                        map.put(annotation.serviceName(), o);//以@RpcService的name属性为key放到Bean容器中
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }catch (Exception e){
            e.printStackTrace();
        }
        return map;
    }

}


